﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Grishko.UI;
using System.IO;
using OutdoorLib.BaseEntity.Contract;
using System.Web.UI;
using OutdoorLib.BaseEntity.Constraction;
using Grishko.DataTier;

/// <summary>
/// Движок - обслуживающий PageMethod  функции RefreshRow()
/// </summary>
#region PageMethod
public class RefreshRowParam
{
    public string SideId { get; set; }              /// сторона
    public string CurrentContractId { get; set; }   /// текущий контракт
    public string TimeLine_dtStart { get; set; }    /// отрезок времени - начало
    public string TimeLine_dtEnd { get; set; }      /// отрезок времени - конец
    public string dtStart { get; set; }             /// расписание - начало 
    public string dtFinish { get; set; }            /// расписание - конец        
    public string TimePeriodID { get; set; }

    public static string GetImAsJavaScriptValue(
                                        string ScriptInclude_CurrentContract,
                                        string TimeLine_dtStart,
                                        string TimeLine_dtEnd,            
                                        string ScriptInclude_dtStart,
                                        string ScriptInclude_dtFinish,
                                        string ScriptInclude_TimaPeriodID
                                        )
    {
          string script = "var PageMethodsParams =" + 
        "{ "+
        "CurrentContractId: '" + ScriptInclude_CurrentContract + "'," +
        "SideId: '',"+
        "TimeLine_dtStart: ' '," +
        "TimeLine_dtEnd: '',"+
        "dtStart: '" + ScriptInclude_dtStart + "'," +
        "dtFinish: '" + ScriptInclude_dtFinish + "'," +
        "TimePeriodID: '" + ScriptInclude_TimaPeriodID + "'" +
        "};";
        return script ; 
    }

}

#endregion

/// <summary>
/// Набор инструментов по прорисовке расписания стороны
/// Основная задача - взять  RefreshRowParam - проанализиовать если есть контракт - свормировать новый отрезок для этого контракта или убрать существующий.
/// Выплюнуть Html - соответсвующий расписанию стороны за указанный период
/// </summary>
public class RefreshSheduleRowEngine
{
    public static string RefreshRow(RefreshRowParam Param)
    {
        RefreshSheduleRowEngine eng = new RefreshSheduleRowEngine(Param);
        return eng.GetHtml();

    }

    RefreshRowParam _Param = null;
    public RefreshSheduleRowEngine(RefreshRowParam Param) { _Param = Param; }
    public string GetHtml()
    {
        //Если Указан контракт - формируем по нему отрезок
        if (!string.IsNullOrEmpty(_Param.CurrentContractId))
            AppendContractSide();


        //Формируем парметры SideShedule
        SideSheduleTable.SideSheduleParams _SideSheduleParams = new SideSheduleTable.SideSheduleParams()
        {
            dtStart = Convert.ToDateTime(_Param.dtStart),
            dtFinish = Convert.ToDateTime(_Param.dtFinish),
            Period = Ecopsy.Tools.DateTimeTools.TimePeriod.Month,
            CurrentContract = Contract
        };

        // формируем HTML
        TextWriter sw = new StringWriter();
        Html32TextWriter w = new Html32TextWriter(sw);

        SideSheduleRow c = new SideSheduleRow(Shedule,
                                              _SideSheduleParams,
                                              "RefreshRow('{0}','{1}','{2}'); "
                                              );
        c.RenderControl(w);
        return sw.ToString();
    }

    private void AppendContractSide()
    {
        Contract.ContractSideItemList.SetContractSurfaceItem(_Param.SideId,
                                                               Convert.ToDateTime(_Param.TimeLine_dtStart),
                                                               Convert.ToDateTime(_Param.TimeLine_dtEnd),
                                                               _Side.CurrentPrice);
        Contract.Update();
        //AppEnvironment.ObjectFactory.SaveObject(Contract);

    }

    private Side _Side { get { return (Side)AppEnvironment.Helper.GetObject(_Param.SideId); } }

    private SideSheduleTable.SideSheduleParams _SideSheduleParams
    {
        get
        {


            //Формируем парметры SideShedule
            SideSheduleTable.SideSheduleParams result = new SideSheduleTable.SideSheduleParams()
            {
                dtStart = Convert.ToDateTime(_Param.dtStart),
                dtFinish = Convert.ToDateTime(_Param.dtFinish),
                Period = Ecopsy.Tools.DateTimeTools.TimePeriod.Month
            };
            if (!string.IsNullOrEmpty(_Param.CurrentContractId))
            {
                result.CurrentContract = (ContractEntity)AppEnvironment.Helper.GetObject(_Param.CurrentContractId);

            }
            return result;

        }
    }
    SideShedule _Shedule = null;
    private SideShedule Shedule
    {
        get
        {
            if (null != _Shedule)
                return _Shedule;

            SecuretyContext SC = AppContext.GetSC();
            _Shedule = new SideShedule() { dtStart = _SideSheduleParams.dtStart, dtEnd = _SideSheduleParams.dtFinish };
            _Shedule.Side = _Side;
            _Shedule.Load();
            return _Shedule;
        }
    }
    ContractEntity _Contract = null;
    private ContractEntity Contract
    {
        get
        {
            if (null != _Contract)
                return _Contract;

            if (String.IsNullOrEmpty(_Param.CurrentContractId))
                return null;

            _Contract = (ContractEntity)SqlTools.GetEntitySingle(_Param.CurrentContractId);
            return _Contract;
        }
    }

}
